//将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转，要求时间复杂度 O(n),空间复杂度O(1)

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
    public class ListNode {
        int val;
        ListNode next = null;
        public ListNode(int val) {
          this.val = val;
        }
      }

    public ListNode reverseBetween (ListNode head, int m, int n) {
        //创建一个虚拟头结点，方便处理m=1的情况
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        //找到m-1个结点 pre
        for(int i = 1; i < m; i++){
            pre = pre.next;
        }
        //找到m个结点
        ListNode cur = pre.next;
        ListNode next;
        //开始反转
        for(int i = 0; i < n - m; i++){
            next = cur.next;
            cur.next = next.next;
            next.next = pre.next;
            pre.next = next;
        }
        return dummy.next;
    }
}
